#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;

int n,m;
int b[100100];
struct Racer
{
	string name;
	int a;
	bool operator < (Racer b) const
	{
		if(a!=b.a) return a>b.a;
		else return name<b.name;
	}
}a[100100];
int tans[100100];
int getHighest(int pos)
{
	tans[pos]=a[pos].a+b[m-1];
	int cnt=0;
	for(int pa=pos-1,eda=0,pb=m-(n-pos)-1;pa>=eda;)
	{
		tans[pa]=a[pa].a;
		if(pb>=0) tans[pa]+=b[pb];
		if(tans[pos]>tans[pa])
		{
			cnt++;
			pa--;
			pb--;
			continue;
		}
		else if(tans[pos]<tans[pa]) pb--,eda++;
		else
		{
			if(a[pos].name<a[pa].name)
			{
				cnt++,pa--,pb--;
				continue;
			}
			else pb--,eda++;
		}
		if(pb<-1) pa--;
	}
	return pos-cnt+1;
}
int getLowest(int pos)
{
	if(pos==n-1) return n;
	tans[pos]=a[pos].a;
	if(m==n) tans[pos]+=b[0];
	int cnt=0;
	for(int pb=0,pa=pos+1;pb<m&&pa<n;)
	{
		tans[pa]=b[pb]+a[pa].a;
		if(tans[pa]>tans[pos])
		{
			cnt++; pa++; pb++;
		}
		else if(tans[pa]<tans[pos]) pb++;
		else
		{
			if(a[pos].name<a[pa].name) pb++;
			else cnt++,pa++,pb++;
		}
	}
	return pos+cnt+1;
}
int main()
{
	int pos;
	string name;
	cin>>n;
	for(int i=0;i<n;i++)	cin>>a[i].name>>a[i].a;
	sort(a,a+n);
	cin>>m;
	for(int i=0;i<m;i++) 	cin>>b[i];
	sort(b,b+m);
	cin>>name;
	for(int i=0;i<n;i++) if(a[i].name==name)
	{
		pos=i;
		break;
	}
	cout<<getHighest(pos)<<" "<<getLowest(pos)<<endl;
	return 0;
}
